package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.common.entity.PageResult;
import com.itheima.common.entity.QueryPageBean;
import com.itheima.common.utils.AliOssUtil;
import com.itheima.freeMarker.SetmealFreeMarker;
import com.itheima.mapper.CheckItemMapper;
import com.itheima.mapper.CheckgroupMapper;
import com.itheima.mapper.SetmealCheckgroupMapper;
import com.itheima.mapper.SetmealMapper;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Setmeal;
import com.itheima.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class SetmealServiceImpl implements SetmealService {



    @Autowired
    private SetmealMapper setmealMapper;

    @Autowired
    public final static String USED_IMG_KEY = "setmealUsedCache";//(自己不会)

    @Autowired
    private SetmealCheckgroupMapper setmealCheckGroupMapper;//套餐和检查组关联关系(自己不会)

    @Autowired
    private CheckgroupMapper checkGroupMapper;//检查组(回显用到)


    @Autowired
    private CheckItemMapper checkItemMapper;//检查项

    @Autowired
    private RedisTemplate<String, String> redisTemplate;//图片缓存时用到

    @Autowired
    private SetmealFreeMarker setmealFreeMarker;


    //套餐管理 分页查询
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //1. 开启分页
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //2. 执行查询 获取分页数据
        List<CheckItem> checkItemList = setmealMapper.findPage(queryPageBean);
        Page<CheckItem> page = (Page<CheckItem>) checkItemList;
        //3. 封装分页结果
        return new PageResult(page.getTotal(), page.getResult());

    }


    //套餐管理 新增套餐
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void add(Setmeal setmeal, List<Integer> checkGroupIds) {
        //1. 补齐参数(这里不用)
        //2. 调用mapper
        setmealMapper.add(setmeal);
        // 检查 setmeal.getId() 是否为 null
        if (setmeal.getId() == null) {
            throw new RuntimeException("Failed to generate setmeal ID");
        }
        //3. 根据套餐id和检查组id关联关系,t_setmeal_checkgroup要添加套餐id和检查组id记录
        for (Integer checkGroupId : checkGroupIds) {
            // 逐个插入setmealId和checkGroupId
            setmealCheckGroupMapper.insertBySetmealIds(setmeal.getId(),checkGroupIds);

        }


        //4. 如果需要添加图片缓存,这里用redis缓存
        if (setmeal.getImg() != null) {
            String fileName = setmeal.getImg().substring(setmeal.getImg().lastIndexOf("/") + 1);
            //添加到redis中
            redisTemplate.opsForSet().add(USED_IMG_KEY, fileName);
            //redisTemplate.opsForValue().set(USED_IMG_KEY + setmeal.getImg(), "1");
        }
        //5. 生成静态页面
        //setmealFreeMarker.createSetmealHtml();


    }

    //套餐管理 修改回显
    @Override
    public Setmeal findById(Integer id) {
        //思路:
        // 首先，通过套餐ID查询套餐信息。
        //然后，查询该套餐下所有相关的检查组。
        //对于每个检查组，通过检查组id查询其包含的所有检查项，并将这些检查项设置到检查组对象中。
        //最后，返回包含检查组和检查项信息的套餐对象。

        // 首先，通过套餐ID查询套餐信息。
        Setmeal setmeal = setmealMapper.findById(id);
        //然后，通过套餐id查询该套餐下所有相关的检查组。
        List<CheckGroup> checkGroups = checkGroupMapper.getGroupAndItmById(id);

        //对于每个检查组，查询其包含的所有检查项，并将这些检查项设置到检查组对象中。
        for (CheckGroup checkGroup : checkGroups) {
            //查询检查组下所有检查项
            checkGroup.setCheckItems(checkItemMapper.getByCheckGroupId(checkGroup.getId()));
        }
        //最后，返回包含检查组和检查项信息的套餐对象。
        return setmeal;


    }

    //套餐管理 修改套餐
    @Transactional
    @Override
    public void update(Setmeal setmeal, List<Integer> checkGroupIds) {
        //1.修改套餐表
        setmealMapper.update(setmeal);
        //2.删除套餐和检查组关联关系
        setmealCheckGroupMapper.deleteBySetmealIds(setmeal.getId());
        //2.新增套餐和检查组关联关系
        /*for (Integer checkGroupId : checkGroupIds) {
            // 逐个插入setmealId和checkGroupId*/
        setmealCheckGroupMapper.insertBySetmealIds(setmeal.getId(),checkGroupIds);

        /*}*/

        //4. 如果需要添加图片缓存,这里用redis缓存
        if (setmeal.getImg() != null) {
            String fileName = setmeal.getImg().substring(setmeal.getImg().lastIndexOf("/") + 1);
            //添加到redis中
            redisTemplate.opsForSet().add(USED_IMG_KEY, fileName);
            //redisTemplate.opsForValue().set(USED_IMG_KEY + setmeal.getImg(), "1");
        }
        //5. 生成静态页面
        //setmealFreeMarker.createSetmealHtml();

    }

    //套餐管理 删除套餐
    @Override
    public void delete(Integer id) {
        //1.删除中间表数据
        setmealCheckGroupMapper.deleteBySetmealIds(id);

        // 3. 删除套餐表
        setmealMapper.delete(id);

    }


}
